Ну что, давайте сгенирируем приложение SDI с именем SDIMDI. Запускаем AppWizard сразу после выбора SDI жмем Finish. Готово, теперь пояснения. Я сделаю проект и Вы сможете его загрузить. Все изменения я буду коментировать вот так. Это на случай если в описании забуду или еще чего. Если Вы уже шаги делали, то понимаете о чем разговор :-)))
// ----- Comments SDI ------- ....... // ----- End Comments SDI --- // ------ New MDI ----------- ..... // -----End New MDI ---------
Отличия MDI и SDI простые: MDI много окон, а в SDI одно окно. У нас пока окно одно. Надо много. Задача ясна.
Первое отличие это то, что у приложения MDI два меню. Первое меню имеет имя IDR_MAINFRAME и используется когда дочернии окна не открыты. Второе меню появляется когда открывается или появляется окно. Оно имеет имя типа IDR_ИМЯ_ПРОЕКТTYPE. Смотрите рисунок ниже.

Раз такое дело, то и нам надо два меню. Давайте его создадим, имя его будет исходя из правил IDR_SDIMDITYPE. Идем в ресурсы и создаем. Только создаем не просто так. Наводим мышь на IDR_MAINFRAME и говорим Inset Copy. В поле Condition введите просто букву a. Появится копия. Потом вызовите свойства и дайте имя IDR_SDIMDITYPE, а из поля Condition удалите a. Теперь из IDR_MAINFRAME нужно удалить ненужные пункты меню.
SAVE SAVE AS PRINT PRINT PRIVIEW RESENT FILE Лишнии разделительные линии EDIT полностьюВ принципе нам бы надо создать меню управления окнами, но черт с ним пока. Каждой строке меню нужен строковый ресурс. Вот теперь пойдите в строковые ресурсы скопируйте и вставьте IDR_MAINFRAME и переименуйте в IDR_SDIMDITYPE.
Теперь нужен еще и значок для окна. Он должен быть с тем же идентификатором. Создайте иконку с идентификатором IDR_SDIMDITYPE. Он у Вас вообще-то должен был появиться в виде DOC1. Посмотрите. Вот добрались и до кода. Первое - это нужно сменить класс рамки окна на CMDIFrameWnd.
//----- Comments SDI ------- //class CMainFrame : public CFrameWnd //----- End Comments SDI --- //------ New MDI ----------- class CMainFrame : public CMDIFrameWnd // -----End New MDI --------- CMainFrame() нужно сделать публичным. protected: // create from serialization only //----- Comments SDI ------- // CMainFrame(); //----- End Comments SDI --- DECLARE_DYNAMIC(CMainFrame) // Attributes public: //------ New MDI ----------- CMainFrame(); // -----End New MDI --------- // OperationsОбратили внимание на DECLARE_DYNAMIC, а не так как в SDI. Теперь нам нужно изменить файл реализации, вот где.
//----- Comments SDI ------- //IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd) //----- End Comments SDI --- //------ New MDI ----------- IMPLEMENT_DYNAMIC(CMainFrame, CMDIFrameWnd) // -----End New MDI ---------Теперь нужно изменить создание шаблона.
//----- Comments SDI -------
//CSingleDocTemplate* pDocTemplate;
//pDocTemplate = new CSingleDocTemplate(
//IDR_MAINFRAME,
//----- End Comments SDI ---
//------ New MDI -----------
CMultiDocTemplate* pDocTemplate;
pDocTemplate = new CMultiDocTemplate(
IDR_SDIMDITYPE,
// -----End New MDI ---------
RUNTIME_CLASS(CSDIMDIDoc),
RUNTIME_CLASS(CMainFrame), // main SDI frame window
RUNTIME_CLASS(CSDIMDIView));
AddDocTemplate(pDocTemplate);
Пора создавать класс рамки окна. // Parse command line for standard shell commands, DDE, file open
//----- Comments SDI -------
//CCommandLineInfo cmdInfo;
//ParseCommandLine(cmdInfo);
// Dispatch commands specified on the command line
//if (!ProcessShellCommand(cmdInfo))
// return FALSE;
//----- End Comments SDI ---
//------ New MDI -----------
CMainFrame* pMain = new CMainFrame;
if (!pMain->LoadFrame(IDR_MAINFRAME))
return FALSE;
m_pMainWnd=pMain;
// -----End New MDI ---------
// The one and only window has been initialized, so show and update it.
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();
return TRUE;
Поменяем в шаблоне класс рамки окна //----- Comments SDI -------
// RUNTIME_CLASS(CMainFrame), // main SDI frame window
//----- End Comments SDI ---
//------ New MDI -----------
RUNTIME_CLASS(CChildFrame),
// -----End New MDI ---------
Но у нас его нет !!! Создадим. Перейдите на вкладку ClassView,
далее NewClass.

И естественно, что этот класс нужно подключить в смысле заголовочного файла:
#include "SDIMDIDoc.h" #include "SDIMDIView.h" //------ New MDI ----------- #include "ChildFrame.h" // -----End New MDI ---------
Всё вроде, проверяйте. Если не работает грузите проект.
Итак кратко.
Два меню, иконы, строковых ресурса. Меняем класс рамки на MDI Меняем шаблон на MDI Меняем рамку шаблона с ChildMDI